package com.neoCalf.neoCommon.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;


public class DateUtils {
    private static final Object lookObj = new Object();
    private static final Map<String, ThreadLocal<SimpleDateFormat>> sdfMap = new HashMap<>();

    /**
     * 缓存管理：使用 Map<String, ThreadLocal<SimpleDateFormat>> 来存储不同日期格式模式的 SimpleDateFormat 实例。
     * 线程安全：通过 ThreadLocal 确保每个线程都有自己的 SimpleDateFormat 实例，避免了线程安全问题。
     * 延迟初始化：使用双重检查锁定（Double-Checked Locking）模式来确保 SimpleDateFormat 实例只在第一次请求时被创建，并且是线程安全的。
     *
     * @param pattern str
     * @return SimpleDateFormat
     */
    private static SimpleDateFormat getSdf(final String pattern) {
        ThreadLocal<SimpleDateFormat> t1 = sdfMap.get(pattern);
        if (t1 == null) {
            synchronized (lookObj) {
                t1 = sdfMap.get(pattern);
                if (t1 == null) {
                    t1 = ThreadLocal.withInitial(() -> new SimpleDateFormat(pattern));
                    sdfMap.put(pattern, t1);
                }
            }
        }
        return t1.get();
    }

    public static String format(Date date, String pattern) {
        return getSdf(pattern).format(date);
    }

    public static Date parse(String dateStr, String pattern) {
        try {
            return getSdf(pattern).parse(dateStr);
        } catch (ParseException e) {
            System.out.println(e.getMessage());
        }
        return null;
    }
}